package com.ushine.web.component.authority.service;

import com.ushine.web.base.model.base.DataFilterMetaDataBO;
import com.ushine.web.component.contant.PermissionConstant;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import org.springframework.stereotype.Service;

import java.util.Set;
import java.util.stream.Collectors;

/**
 * @Author: yls
 * @Date 2022/2/9 16:51
 * @Description: 6种数据权限的具体逻辑处理
 * @Version 1.0
 **/
@Slf4j
@Service
public class TemplateSqlServiceImpl {
    /**
     * 功能描述:
     * 〈 查看本人所在组织机构以及下属机构 〉
     *
     * @param where                基础sql条件
     * @param dataFilterMetaDataBO 权限相关业务类
     * @return : net.sf.jsqlparser.expression.operators.conditional.AndExpression
     * @author : yls
     * @date : 2022/2/9 16:57
     */
    Expression getSqlByAll(Expression where, DataFilterMetaDataBO dataFilterMetaDataBO) {
        return where;
    }


    /**
     * 功能描述:
     * 〈 查看本人多个组织数据，下属组织需要自己组装list〉
     *
     * @param where                基础sql条件
     * @param dataFilterMetaDataBO 权限相关业务类
     * @return : net.sf.jsqlparser.expression.operators.conditional.AndExpression
     * @author : yls
     * @date : 2022/2/9 16:57
     */
    AndExpression getSqlByDeptSets(Expression where, DataFilterMetaDataBO dataFilterMetaDataBO) {
        /*
         * 创建IN 表达式
         * 创建IN范围的元素集合
         */
        Set<Long> deptIds = dataFilterMetaDataBO.getDeptIds();
        // 把集合转变为JSQLParser需要的元素列表
        ItemsList itemsList = new ExpressionList(deptIds.stream().map(LongValue::new).collect(Collectors.toList()));
        InExpression inExpression = new InExpression(new Column(PermissionConstant.FIELD_CREATE_ORG), itemsList);
        return new AndExpression(where, inExpression);
    }


    /**
     * 功能描述:
     * 〈 查看当前组织的数据 〉
     *
     * @param where                基础sql条件
     * @param dataFilterMetaDataBO 权限相关业务类
     * @return : net.sf.jsqlparser.expression.operators.conditional.AndExpression
     * @author : yls
     * @date : 2022/2/9 16:57
     */
    AndExpression getSqlByDept(Expression where, DataFilterMetaDataBO dataFilterMetaDataBO) {
        /*  = 表达式
         *   dept_id = deptId
         */
        EqualsTo equalsTo = new EqualsTo();
        equalsTo.setLeftExpression(new Column(PermissionConstant.FIELD_CREATE_ORG));
        equalsTo.setRightExpression(new LongValue(dataFilterMetaDataBO.getDeptId()));
        /*
         * 创建 AND 表达式 拼接Where 和 = 表达式
         * WHERE xxx AND dept_id = 3
         */
        return new AndExpression(where, equalsTo);
    }


    /**
     * 功能描述:
     * 〈 查看自己的数据 〉
     *
     * @param where                基础sql条件
     * @param dataFilterMetaDataBO 权限相关业务类
     * @return : net.sf.jsqlparser.expression.operators.conditional.AndExpression
     * @author : yls
     * @date : 2022/2/9 16:57
     */
    AndExpression getSqlBySelf(Expression where, DataFilterMetaDataBO dataFilterMetaDataBO) {
        // create_by = userId
        EqualsTo selfEqualsTo = new EqualsTo();
        selfEqualsTo.setLeftExpression(new Column(PermissionConstant.FIELD_CREATE_SELF));
        selfEqualsTo.setRightExpression(new LongValue(dataFilterMetaDataBO.getUserId()));
        return new AndExpression(where, selfEqualsTo);
    }


    /**
     * 功能描述:
     * 〈 查看自己创建的数据 〉
     *
     * @param where                基础sql条件
     * @param dataFilterMetaDataBO 权限相关业务类
     * @return : net.sf.jsqlparser.expression.operators.conditional.AndExpression
     * @author : yls
     * @date : 2022/2/9 16:57
     */
    AndExpression getSqlBySelfCreate(Expression where, DataFilterMetaDataBO dataFilterMetaDataBO) {
        // create_user_id = userId
        EqualsTo selfCreateEqualsTo = new EqualsTo();
        selfCreateEqualsTo.setLeftExpression(new Column(PermissionConstant.FIELD_CREATE_USER));
        selfCreateEqualsTo.setRightExpression(new LongValue(dataFilterMetaDataBO.getUserId()));
        return new AndExpression(where, selfCreateEqualsTo);
    }

    /**
     * 功能描述:
     * 〈 查询自定义sql数据 〉
     *
     * @param where                基础sql条件
     * @param dataFilterMetaDataBO 权限相关业务类
     * @return : net.sf.jsqlparser.expression.operators.conditional.AndExpression
     * @author : yls
     * @date : 2022/2/9 16:57
     */
    AndExpression getSqlByDiy(Expression where, DataFilterMetaDataBO dataFilterMetaDataBO) {
        //自定义sql查询
        String customSql = dataFilterMetaDataBO.getSql();
        Expression expressionCustom = null;
        try {
            expressionCustom = CCJSqlParserUtil.parseCondExpression(customSql);
        } catch (Exception e) {
            log.info("exception:", e);
        }
        return new AndExpression(where, new Parenthesis(expressionCustom));
    }


}
